our
$VERSION
=
'0.009032'
;
$VERSION
=~
tr
/_//d;
my
$locate_metaclass
=
sub
{
my
$class
= Scalar::Util::blessed(
$_
[0]) ||
$_
[0];
return
Class::MOP::get_metaclass_by_name(
$class
)
|| Moose::Meta::Class->initialize(
$class
);
};
sub
BUILD { }
around
'BUILD'
=>
sub
{
my
$orig
=
shift
;
my
$self
=
shift
;
my
%args
= %{
$_
[0] };
$self
->
$orig
(\
%args
);
my
@extra
=
grep
{ !
exists
(
$self
->{
$_
}) }
keys
%args
;
@{
$self
}{
@extra
} =
@args
{
@extra
};
return
$self
;
};
sub
mk_accessors {
my
$self
=
shift
;
my
$meta
=
$locate_metaclass
->(
$self
);
my
$class
=
$meta
->name;
confess(
"You are trying to modify ${class}, which has been made immutable, this is "
.
"not supported. Try subclassing ${class}, rather than monkeypatching it"
)
if
$meta
->is_immutable;
for
my
$attr_name
(
@_
){
$meta
->remove_attribute(
$attr_name
)
if
$meta
->find_attribute_by_name(
$attr_name
);
my
$reader
=
$self
->accessor_name_for(
$attr_name
);
my
$writer
=
$self
->mutator_name_for(
$attr_name
);
if
(
$reader
eq
$writer
){
my
%opts
= (
$meta
->has_method(
$reader
) ? (
is
=>
'bare'
) : (
accessor
=>
$reader
) );
my
$attr
=
$meta
->find_attribute_by_name(
$attr_name
) ||
$meta
->add_attribute(
$attr_name
,
%opts
,
traits
=> [
'MooseX::Emulate::Class::Accessor::Fast::Meta::Role::Attribute'
]
);
if
(
$attr_name
eq
$reader
){
my
$alias
=
"_${attr_name}_accessor"
;
next
if
$meta
->has_method(
$alias
);
$meta
->add_method(
$alias
=>
$attr
->get_read_method_ref);
}
}
else
{
my
@opts
= (
$meta
->has_method(
$writer
) ? () : (
writer
=>
$writer
) );
push
(
@opts
, (
reader
=>
$reader
))
unless
$meta
->has_method(
$reader
);
my
$attr
=
$meta
->find_attribute_by_name(
$attr_name
) ||
$meta
->add_attribute(
$attr_name
,
@opts
,
traits
=> [
'MooseX::Emulate::Class::Accessor::Fast::Meta::Role::Attribute'
]
);
}
}
}
sub
mk_ro_accessors {
my
$self
=
shift
;
my
$meta
=
$locate_metaclass
->(
$self
);
my
$class
=
$meta
->name;
confess(
"You are trying to modify ${class}, which has been made immutable, this is "
.
"not supported. Try subclassing ${class}, rather than monkeypatching it"
)
if
$meta
->is_immutable;
for
my
$attr_name
(
@_
){
$meta
->remove_attribute(
$attr_name
)
if
$meta
->find_attribute_by_name(
$attr_name
);
my
$reader
=
$self
->accessor_name_for(
$attr_name
);
my
@opts
= (
$meta
->has_method(
$reader
) ? (
is
=>
'bare'
) : (
reader
=>
$reader
) );
my
$attr
=
$meta
->add_attribute(
$attr_name
,
@opts
,
traits
=> [
'MooseX::Emulate::Class::Accessor::Fast::Meta::Role::Attribute'
]
)
if
scalar
(
@opts
);
if
(
$reader
eq
$attr_name
&&
$reader
eq
$self
->mutator_name_for(
$attr_name
)){
$meta
->add_method(
"_${attr_name}_accessor"
=>
$attr
->get_read_method_ref)
unless
$meta
->has_method(
"_${attr_name}_accessor"
);
}
}
}
sub
mk_wo_accessors {
my
$self
=
shift
;
my
$meta
=
$locate_metaclass
->(
$self
);
my
$class
=
$meta
->name;
confess(
"You are trying to modify ${class}, which has been made immutable, this is "
.
"not supported. Try subclassing ${class}, rather than monkeypatching it"
)
if
$meta
->is_immutable;
for
my
$attr_name
(
@_
){
$meta
->remove_attribute(
$attr_name
)
if
$meta
->find_attribute_by_name(
$attr_name
);
my
$writer
=
$self
->mutator_name_for(
$attr_name
);
my
@opts
= (
$meta
->has_method(
$writer
) ? () : (
writer
=>
$writer
) );
my
$attr
=
$meta
->add_attribute(
$attr_name
,
@opts
,
traits
=> [
'MooseX::Emulate::Class::Accessor::Fast::Meta::Role::Attribute'
]
)
if
scalar
(
@opts
);
if
(
$writer
eq
$attr_name
&&
$writer
eq
$self
->accessor_name_for(
$attr_name
)){
$meta
->add_method(
"_${attr_name}_accessor"
=>
$attr
->get_write_method_ref)
unless
$meta
->has_method(
"_${attr_name}_accessor"
);
}
}
}
sub
follow_best_practice {
my
$self
=
shift
;
my
$meta
=
$locate_metaclass
->(
$self
);
$meta
->remove_method(
'mutator_name_for'
);
$meta
->remove_method(
'accessor_name_for'
);
$meta
->add_method(
'mutator_name_for'
,
sub
{
return
"set_"
.
$_
[1] });
$meta
->add_method(
'accessor_name_for'
,
sub
{
return
"get_"
.
$_
[1] });
}
sub
mutator_name_for {
return
$_
[1] }
sub
accessor_name_for {
return
$_
[1] }
sub
set {
my
$self
=
shift
;
my
$k
=
shift
;
confess
"Wrong number of arguments received"
unless
scalar
@_
;
my
$meta
=
$locate_metaclass
->(
$self
);
confess
"No such attribute '$k'"
unless
(
my
$attr
=
$meta
->find_attribute_by_name(
$k
) );
my
$writer
=
$attr
->get_write_method;
$self
->
$writer
(
@_
> 1 ? [
@_
] :
@_
);
}
sub
get {
my
$self
=
shift
;
confess
"Wrong number of arguments received"
unless
scalar
@_
;
my
$meta
=
$locate_metaclass
->(
$self
);
my
@values
;
for
(
@_
){
confess
"No such attribute '$_'"
unless
(
my
$attr
=
$meta
->find_attribute_by_name(
$_
) );
my
$reader
=
$attr
->get_read_method;
@_
> 1 ?
push
(
@values
,
$self
->
$reader
) :
return
$self
->
$reader
;
}
return
@values
;
}
sub
make_accessor {
my
(
$class
,
$field
) =
@_
;
my
$meta
=
$locate_metaclass
->(
$class
);
my
$attr
=
$meta
->find_attribute_by_name(
$field
) ||
$meta
->add_attribute(
$field
,
traits
=> [
'MooseX::Emulate::Class::Accessor::Fast::Meta::Role::Attribute'
],
is
=>
'bare'
,
);
my
$reader
=
$attr
->get_read_method_ref;
my
$writer
=
$attr
->get_write_method_ref;
return
sub
{
my
$self
=
shift
;
return
$reader
->(
$self
)
unless
@_
;
return
$writer
->(
$self
,(
@_
> 1 ? [
@_
] :
@_
));
}
}
sub
make_ro_accessor {
my
(
$class
,
$field
) =
@_
;
my
$meta
=
$locate_metaclass
->(
$class
);
my
$attr
=
$meta
->find_attribute_by_name(
$field
) ||
$meta
->add_attribute(
$field
,
traits
=> [
'MooseX::Emulate::Class::Accessor::Fast::Meta::Role::Attribute'
],
is
=>
'bare'
,
);
return
$attr
->get_read_method_ref;
}
sub
make_wo_accessor {
my
(
$class
,
$field
) =
@_
;
my
$meta
=
$locate_metaclass
->(
$class
);
my
$attr
=
$meta
->find_attribute_by_name(
$field
) ||
$meta
->add_attribute(
$field
,
traits
=> [
'MooseX::Emulate::Class::Accessor::Fast::Meta::Role::Attribute'
],
is
=>
'bare'
,
);
return
$attr
->get_write_method_ref;
}
1;