Describe how easy to is to create a (or reproduce an existing) metaclass using a...
[gitmo/Moose.git] / t / 000_recipes / 022_attribute_trait.t
index 5986ca0..223fb65 100644 (file)
@@ -3,7 +3,7 @@
 use strict;
 use warnings;
 
-use Test::More tests => 2;
+use Test::More tests => 3;
 use Test::Exception;
 
 BEGIN {
@@ -76,5 +76,64 @@ is($app->dump, q{name: Google
 The site's URL: http://google.com
 }, '... got the expected dump value');
 
+# using the trait directly in a regular metaclass
+{
+    package MyApp::Meta::Attribute::Labeled;
+    use Moose;
+    extends 'Moose::Meta::Attribute';
+    with 'MyApp::Meta::Attribute::Trait::Labeled';
+
+    package Moose::Meta::Attribute::Custom::Labeled;
+    sub register_implementation { 'MyApp::Meta::Attribute::Labeled' }
+
+    package MyApp::Website2;
+    use Moose;
+
+    has url => (
+        metaclass => 'Labeled',
+        isa       => 'Str',
+        is        => 'rw',
+        label     => "The site's URL",
+    );
+
+    has name => (
+        is  => 'rw',
+        isa => 'Str',
+    );
+
+    sub dump {
+        my $self = shift;
 
+        my $dump_value = '';
+        
+        # iterate over all the attributes in $self
+        my %attributes = %{ $self->meta->get_attribute_map };
+        foreach my $name (sort keys %attributes) {
+    
+            my $attribute = $attributes{$name};
+            
+            # print the label if available
+            if ($attribute->isa('MyApp::Meta::Attribute::Labeled')
+                && $attribute->has_label) {
+                    $dump_value .= $attribute->label;
+            }
+            # otherwise print the name
+            else {
+                $dump_value .= $name;
+            }
+
+            # print the attribute's value
+            my $reader = $attribute->get_read_method;
+            $dump_value .= ": " . $self->$reader . "\n";
+        }
+        
+        return $dump_value;
+    }
+
+}
+
+my $app2 = MyApp::Website2->new(url => "http://google.com", name => "Google");
+is($app2->dump, q{name: Google
+The site's URL: http://google.com
+}, '... got the expected dump value');