On Mon, Dec 01, 2003 at 10:42:09AM -0500, Hodges, Paul wrote:
> So is this a good time to divert this topic into an elaboration of roles?
I can wait for A12, but in the mean time ... :-)
> So if I want to implement a package of related roles that I commonly use in
> our In-House code, such as to specify how verbose an object should be on log
> output, and how touchy it should be over whether a problem is screamingly
> fatal or just warningly annoying, and maybe toss in a shorthand method that
> lets me pass the names of some specific traits I want to be able to use (
> like "allow(qw/winkin blinkin nod/)" or some such), it should be pretty
> simple....but I'm having a hard time coming up with the syntax that declares
> the package and exports the roles.
>
> module IHL::Roles;
> @ISA = 'Exporter';
> @EXPORT_OK = qw/ fatal verbose allow setvals /;
>
> our role fatal is property {
> has $.fatal is rw;
> }
>
> our role verbose is property {
> has $.verbose is rw;
> }
>
> sub allow {
> .... # I'd want to make this one too complex to actually do it here
> }
>
> sub import {
> allow @_[1...];
> }
>
> sub setvals ($o, [EMAIL PROTECTED]) {
> "\$o.$_ = true".eval for @t; # surely there's a better way to do this?
> }
Trying to keep up here ... but couldn't you do something like this?
sub setvals ($o, [EMAIL PROTECTED]) {
$o but= $_(true);
}
er, wouldn't you *have* to do something like that. If the object in
$o hasn't the property "foo", then C<$o.foo = true;> would be an
error, so you're trying to do 2 things: 1) give the object a property
and 2) assign a value to that property.
I think you're trying to do too much in the above code. If you just
have a common set of roles that you want to use across objects, you
could do this:
module MyRoles;
use Exporter;
@EXPORT_OK = <<verbose fatal>>;
our property verbose is true;
our property fatal is true;
our property notexported;
our property *trulyglobal;
then in other code:
use MyRoles;
use SomeFancyStuff;
my $o = SomeFancyStuff.new() but verbose;
$o but= MyRoles.notexported;
$o but= trulyglobal;
Or am I missing something?
> then write allow() to build roles for each value passed in, maybe taking an
> arg to say whether they should be truly global, or built in the caller's
> namespace....
Isn't that what my, our, Exporter, and the globalifying * are all about?
I look forward with much anticipation to A12.
-Scott
--
Jonathan Scott Duff
[EMAIL PROTECTED]