On Jan 28, 2011, at 4:06 PM, Zbigniew Lukasiak wrote:
On Fri, Jan 28, 2011 at 9:35 PM, Karen Etheridge <[email protected]>
wrote:
On Fri, Jan 28, 2011 at 09:29:04PM +0100, Zbigniew Lukasiak wrote:
Are there any sane options for building Moose::Roles out of Non
Moose classes?
Or maybe it is trivial?
The thing about roles is they aren't instantiated, so you can't
really do:
package MyApp::Role::Foo;
use base 'Some::Other::Class';
use Moose::Role;
...because there is no way to call up the inheritance tree to get at
methods in Some::Other::Class. However, if you imported functions
from
that class into your role, you can make them available in your role
just
the same as if you had implemented them into your role itself.
Perhaps can you describe an example of what you want to do?
Well - that's what I was thinking, but:
use strict;
use warnings;
{
package Aa;
use Exporter 'import';
our @EXPORT_OK = qw(foo);
sub foo{
print "foooooooooo\n";
}
}
{
package Bb;
use Moose::Role;
Aa->import( 'foo' );
sub baz {
foo(shift);
}
sub bar {
print "baaaaaaaaaaar\n";
}
}
{
package Cc;
use Moose;
with 'Bb';
}
my $c = Cc->new();
$c->bar;
$c->baz;
$c->foo;
prints:
baaaaaaaaaaar
foooooooooo
Can't locate object method "foo" via package "Cc" at a.pl line 37.
So there is something missing, foo is not recognized as a method.
No, because 'foo' is not a method, it is an imported function from
another package. Class::MOP checks the STASH of the CV to find out if
it is a native of that package and if not, it assumes it is an
imported function and therefore ignores it.
It is a feature, not a bug :)
- Stevan