From: Tokuhiro Matsuno Date: Wed, 4 Mar 2009 23:49:51 +0000 (+0000) Subject: added YourClass->meta->add_attribute(foo => (is => 'ro', isa => 'Str')); support. X-Git-Tag: 0.19~16 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=60f6eba91f12d48fa30a8e16abe2db8c95b4d878;p=gitmo%2FMouse.git added YourClass->meta->add_attribute(foo => (is => 'ro', isa => 'Str')); support. --- diff --git a/lib/Mouse.pm b/lib/Mouse.pm index 2281d35..67c1e77 100644 --- a/lib/Mouse.pm +++ b/lib/Mouse.pm @@ -29,30 +29,7 @@ sub extends { Mouse::Meta::Class->initialize(caller)->superclasses(@_) } sub has { my $meta = Mouse::Meta::Class->initialize(caller); - - my $names = shift; - $names = [$names] if !ref($names); - my $metaclass = 'Mouse::Meta::Attribute'; - my %options = @_; - - if ( my $metaclass_name = delete $options{metaclass} ) { - my $new_class = Mouse::Util::resolve_metaclass_alias( - 'Attribute', - $metaclass_name - ); - if ( $metaclass ne $new_class ) { - $metaclass = $new_class; - } - } - - for my $name (@$names) { - if ($name =~ s/^\+//) { - $metaclass->clone_parent($meta, $name, @_); - } - else { - $metaclass->create($meta, $name, @_); - } - } + $meta->add_attribute(@_); } sub before { diff --git a/lib/Mouse/Meta/Class.pm b/lib/Mouse/Meta/Class.pm index 07b54e7..8e89567 100644 --- a/lib/Mouse/Meta/Class.pm +++ b/lib/Mouse/Meta/Class.pm @@ -98,9 +98,35 @@ sub get_all_method_names { sub add_attribute { my $self = shift; - my $attr = shift; - $self->{'attributes'}{$attr->name} = $attr; + if (@_ == 1 && blessed($_[0])) { + my $attr = shift @_; + $self->{'attributes'}{$attr->name} = $attr; + } else { + my $names = shift @_; + $names = [$names] if !ref($names); + my $metaclass = 'Mouse::Meta::Attribute'; + my %options = @_; + + if ( my $metaclass_name = delete $options{metaclass} ) { + my $new_class = Mouse::Util::resolve_metaclass_alias( + 'Attribute', + $metaclass_name + ); + if ( $metaclass ne $new_class ) { + $metaclass = $new_class; + } + } + + for my $name (@$names) { + if ($name =~ s/^\+//) { + $metaclass->clone_parent($self, $name, @_); + } + else { + $metaclass->create($self, $name, @_); + } + } + } } sub compute_all_applicable_attributes { @@ -351,7 +377,7 @@ Returns the name of the owner class. Gets (or sets) the list of superclasses of the owner class. -=head2 add_attribute Mouse::Meta::Attribute +=head2 add_attribute (Mouse::Meta::Attribute| name => spec) Begins keeping track of the existing L for the owner class. diff --git a/t/046-meta-add_attribute.t b/t/046-meta-add_attribute.t new file mode 100644 index 0000000..67ce344 --- /dev/null +++ b/t/046-meta-add_attribute.t @@ -0,0 +1,17 @@ +use strict; +use warnings; +use Test::More tests => 1; + +{ + package Foo; + use Mouse; +} + +Foo->meta->add_attribute( + 'foo' => ( + is => 'ro', + isa => 'Str', + default => 'bar', + ) +); +is(Foo->new->foo, 'bar');