You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucy.apache.org by nw...@apache.org on 2015/05/09 19:50:03 UTC

[06/11] lucy-clownfish git commit: Move class_name field from CFCSymbol to CFCMethod

Move class_name field from CFCSymbol to CFCMethod


Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/89bf831d
Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/89bf831d
Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/89bf831d

Branch: refs/heads/master
Commit: 89bf831d4649c97be4079787277d19baa300f066
Parents: 587d26b
Author: Nick Wellnhofer <we...@aevum.de>
Authored: Tue Apr 21 11:09:23 2015 +0200
Committer: Nick Wellnhofer <we...@aevum.de>
Committed: Thu May 7 21:19:37 2015 +0200

----------------------------------------------------------------------
 compiler/perl/lib/Clownfish/CFC.pm | 26 ++++++--------
 compiler/perl/lib/Clownfish/CFC.xs | 60 +++++++++++----------------------
 compiler/perl/t/051-symbol.t       | 20 ++---------
 compiler/perl/t/200-function.t     |  1 -
 compiler/perl/t/201-method.t       | 20 ++++++++++-
 compiler/perl/t/300-variable.t     |  5 ++-
 compiler/perl/t/401-class.t        | 11 +++---
 compiler/src/CFCCallable.c         |  6 ++--
 compiler/src/CFCCallable.h         |  5 +--
 compiler/src/CFCFunction.c         | 17 +++++-----
 compiler/src/CFCFunction.h         |  7 ++--
 compiler/src/CFCMethod.c           | 57 +++++++++++++++----------------
 compiler/src/CFCMethod.h           | 21 +++++-------
 compiler/src/CFCParseHeader.y      | 19 ++++-------
 compiler/src/CFCSymbol.c           | 27 ++-------------
 compiler/src/CFCSymbol.h           | 14 ++------
 compiler/src/CFCTestClass.c        |  9 +++--
 compiler/src/CFCTestFunction.c     |  5 ++-
 compiler/src/CFCTestMethod.c       | 40 +++++++++++-----------
 compiler/src/CFCTestSymbol.c       | 27 ++++-----------
 compiler/src/CFCTestVariable.c     |  8 ++---
 compiler/src/CFCVariable.c         | 11 +++---
 compiler/src/CFCVariable.h         |  8 ++---
 23 files changed, 162 insertions(+), 262 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/89bf831d/compiler/perl/lib/Clownfish/CFC.pm
----------------------------------------------------------------------
diff --git a/compiler/perl/lib/Clownfish/CFC.pm b/compiler/perl/lib/Clownfish/CFC.pm
index 6d9cd28..c71c63d 100644
--- a/compiler/perl/lib/Clownfish/CFC.pm
+++ b/compiler/perl/lib/Clownfish/CFC.pm
@@ -215,7 +215,6 @@ BEGIN { XSLoader::load( 'Clownfish::CFC', '0.4.0' ) }
 
     my %new_PARAMS = (
         return_type => undef,
-        class_name  => undef,
         param_list  => undef,
         name        => undef,
         docucomment => undef,
@@ -230,8 +229,7 @@ BEGIN { XSLoader::load( 'Clownfish::CFC', '0.4.0' ) }
         $args{inline} ||= 0;
         return _new(
             @args{
-                qw( exposure class_name name return_type param_list docucomment
-                    inline )
+                qw( exposure name return_type param_list docucomment inline )
                 }
         );
     }
@@ -296,10 +294,10 @@ BEGIN { XSLoader::load( 'Clownfish::CFC', '0.4.0' ) }
 
     my %new_PARAMS = (
         return_type => undef,
-        class_name  => undef,
         param_list  => undef,
         name        => undef,
         docucomment => undef,
+        class_name  => undef,
         abstract    => undef,
         final       => undef,
         exposure    => 'parcel',
@@ -313,7 +311,7 @@ BEGIN { XSLoader::load( 'Clownfish::CFC', '0.4.0' ) }
         $args{final}    ||= 0;
         return _new(
             @args{
-                qw( exposure class_name name return_type param_list docucomment
+                qw( exposure name return_type param_list docucomment class_name
                     final abstract )
                 }
         );
@@ -446,9 +444,8 @@ BEGIN { XSLoader::load( 'Clownfish::CFC', '0.4.0' ) }
     use Carp;
 
     my %new_PARAMS = (
-        exposure   => undef,
-        class_name => undef,
-        name       => undef,
+        exposure => undef,
+        name     => undef,
     );
 
     sub new {
@@ -456,7 +453,7 @@ BEGIN { XSLoader::load( 'Clownfish::CFC', '0.4.0' ) }
         verify_args( \%new_PARAMS, %args ) or confess $@;
         confess "no subclassing allowed" unless $either eq __PACKAGE__;
         return _new(
-            @args{qw( exposure class_name name )} );
+            @args{qw( exposure name )} );
     }
 }
 
@@ -624,11 +621,10 @@ BEGIN { XSLoader::load( 'Clownfish::CFC', '0.4.0' ) }
     use Carp;
 
     our %new_PARAMS = (
-        type       => undef,
-        name       => undef,
-        exposure   => 'local',
-        class_name => undef,
-        inert      => undef,
+        type     => undef,
+        name     => undef,
+        exposure => 'local',
+        inert    => undef,
     );
 
     sub new {
@@ -638,7 +634,7 @@ BEGIN { XSLoader::load( 'Clownfish::CFC', '0.4.0' ) }
         $args{exposure} ||= 'local';
         return _new(
             @args{
-                qw( exposure class_name name type inert )
+                qw( exposure name type inert )
                 }
         );
     }

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/89bf831d/compiler/perl/lib/Clownfish/CFC.xs
----------------------------------------------------------------------
diff --git a/compiler/perl/lib/Clownfish/CFC.xs b/compiler/perl/lib/Clownfish/CFC.xs
index a894710..090a63d 100644
--- a/compiler/perl/lib/Clownfish/CFC.xs
+++ b/compiler/perl/lib/Clownfish/CFC.xs
@@ -646,9 +646,8 @@ PPCODE:
 MODULE = Clownfish::CFC   PACKAGE = Clownfish::CFC::Model::Function
 
 SV*
-_new(exposure_sv, class_name_sv, name_sv, return_type, param_list, docucomment, is_inline)
+_new(exposure_sv, name_sv, return_type, param_list, docucomment, is_inline)
     SV *exposure_sv;
-    SV *class_name_sv;
     SV *name_sv;
     CFCType *return_type;
     CFCParamList *param_list;
@@ -657,13 +656,10 @@ _new(exposure_sv, class_name_sv, name_sv, return_type, param_list, docucomment,
 CODE:
     const char *exposure =
         SvOK(exposure_sv) ? SvPV_nolen(exposure_sv) : NULL;
-    const char *class_name =
-        SvOK(class_name_sv) ? SvPV_nolen(class_name_sv) : NULL;
     const char *name =
         SvOK(name_sv) ? SvPV_nolen(name_sv) : NULL;
-    CFCFunction *self
-        = CFCFunction_new(exposure, class_name, name, return_type, param_list,
-                          docucomment, is_inline);
+    CFCFunction *self = CFCFunction_new(exposure, name, return_type,
+                                        param_list, docucomment, is_inline);
     RETVAL = S_cfcbase_to_perlref(self);
     CFCBase_decref((CFCBase*)self);
 OUTPUT: RETVAL
@@ -827,13 +823,13 @@ PPCODE:
 MODULE = Clownfish::CFC   PACKAGE = Clownfish::CFC::Model::Method
 
 SV*
-_new(exposure_sv, class_name_sv, name, return_type, param_list, docucomment, is_final, is_abstract)
+_new(exposure_sv, name, return_type, param_list, docucomment, class_name_sv, is_final, is_abstract)
     SV *exposure_sv;
-    SV *class_name_sv;
     const char *name;
     CFCType *return_type;
     CFCParamList *param_list;
     CFCDocuComment *docucomment;
+    SV *class_name_sv;
     int is_final;
     int is_abstract;
 CODE:
@@ -842,8 +838,8 @@ CODE:
     const char *class_name =
         SvOK(class_name_sv) ? SvPV_nolen(class_name_sv) : NULL;
     CFCMethod *self
-        = CFCMethod_new(exposure, class_name, name, return_type, param_list,
-                        docucomment, is_final, is_abstract);
+        = CFCMethod_new(exposure, name, return_type, param_list, docucomment,
+                        class_name, is_final, is_abstract);
     RETVAL = S_cfcbase_to_perlref(self);
     CFCBase_decref((CFCBase*)self);
 OUTPUT: RETVAL
@@ -1284,19 +1280,14 @@ PPCODE:
 MODULE = Clownfish::CFC   PACKAGE = Clownfish::CFC::Model::Symbol
 
 SV*
-_new(exposure, class_name_sv, name_sv)
+_new(exposure, name_sv)
     const char *exposure;
-    SV *class_name_sv;
     SV *name_sv;
 CODE:
-    const char *class_name = SvOK(class_name_sv)
-                             ? SvPV_nolen(class_name_sv)
-                             : NULL;
-    const char *name       = SvOK(name_sv)
-                             ? SvPV_nolen(name_sv)
-                             : NULL;
-    CFCSymbol *self
-        = CFCSymbol_new(exposure, class_name, name);
+    const char *name = SvOK(name_sv)
+                       ? SvPV_nolen(name_sv)
+                       : NULL;
+    CFCSymbol *self = CFCSymbol_new(exposure, name);
     RETVAL = S_cfcbase_to_perlref(self);
     CFCBase_decref((CFCBase*)self);
 OUTPUT: RETVAL
@@ -1334,7 +1325,6 @@ void
 _set_or_get(self, ...)
     CFCSymbol *self;
 ALIAS:
-    get_class_name     = 4
     get_exposure       = 8
     get_name           = 10
     public             = 18
@@ -1344,13 +1334,6 @@ ALIAS:
 PPCODE:
 {
     START_SET_OR_GET_SWITCH
-        case 4: {
-                const char *class_name = CFCSymbol_get_class_name(self);
-                retval = class_name
-                         ? newSVpvn(class_name, strlen(class_name))
-                         : newSV(0);
-            }
-            break;
         case 8: {
                 const char *exposure = CFCSymbol_get_exposure(self);
                 retval = newSVpvn(exposure, strlen(exposure));
@@ -1752,21 +1735,17 @@ OUTPUT: RETVAL
 MODULE = Clownfish::CFC  PACKAGE = Clownfish::CFC::Model::Variable
 
 SV*
-_new(exposure, class_name_sv, name_sv, type_sv, inert_sv)
+_new(exposure, name_sv, type_sv, inert_sv)
     const char *exposure;
-    SV *class_name_sv;
     SV *name_sv;
     SV *type_sv;
     SV *inert_sv;
 CODE:
-    const char *class_name = SvOK(class_name_sv)
-                             ? SvPV_nolen(class_name_sv)
-                             : NULL;
-    const char *name       = SvOK(name_sv)
-                             ? SvPV_nolen(name_sv)
-                             : NULL;
-    int inert              = SvOK(inert_sv)
-                             ? !!SvTRUE(inert_sv) : 0;
+    const char *name = SvOK(name_sv)
+                       ? SvPV_nolen(name_sv)
+                       : NULL;
+    int inert        = SvOK(inert_sv)
+                       ? !!SvTRUE(inert_sv) : 0;
     CFCType *type = NULL;
     if (SvOK(type_sv) && sv_derived_from(type_sv, "Clownfish::CFC::Model::Type")) {
         IV objint = SvIV((SV*)SvRV(type_sv));
@@ -1775,8 +1754,7 @@ CODE:
     else {
         croak("Param 'type' is not a Clownfish::CFC::Model::Type");
     }
-    CFCVariable *self
-        = CFCVariable_new(exposure, class_name, name, type, inert);
+    CFCVariable *self = CFCVariable_new(exposure, name, type, inert);
     RETVAL = S_cfcbase_to_perlref(self);
     CFCBase_decref((CFCBase*)self);
 OUTPUT: RETVAL

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/89bf831d/compiler/perl/t/051-symbol.t
----------------------------------------------------------------------
diff --git a/compiler/perl/t/051-symbol.t b/compiler/perl/t/051-symbol.t
index b8dabad..9e463cd 100644
--- a/compiler/perl/t/051-symbol.t
+++ b/compiler/perl/t/051-symbol.t
@@ -16,19 +16,11 @@
 use strict;
 use warnings;
 
-use Test::More tests => 34;
+use Test::More tests => 24;
 use Clownfish::CFC;
 
 my $parcel = Clownfish::CFC::Model::Parcel->new( name => 'Eep' );
 
-for (qw( foo 1Foo Foo_Bar 1FOOBAR )) {
-    eval { my $thing = new_symbol( class_name => $_ ) };
-    like( $@, qr/class_name/, "Reject invalid class name $_" );
-    my $bogus_middle = "Foo::" . $_ . "::Bar";
-    eval { my $thing = new_symbol( class_name => $bogus_middle ) };
-    like( $@, qr/class_name/, "Reject invalid class name $bogus_middle" );
-}
-
 my @exposures = qw( public private parcel local );
 for my $exposure (@exposures) {
     my $thing = new_symbol( exposure => $exposure );
@@ -37,11 +29,6 @@ for my $exposure (@exposures) {
     ok( !$thing->$_, "$exposure means not $_" ) for @not_exposures;
 }
 
-my $foo    = new_symbol( class_name => 'Foo' );
-my $foo_jr = new_symbol( class_name => 'Foo::FooJr' );
-ok( !$foo->equals($foo_jr), "different class_name spoils equals" );
-is( $foo_jr->get_class_name, "Foo::FooJr", "get_class_name" );
-
 my $public_exposure = new_symbol( exposure => 'public' );
 my $parcel_exposure = new_symbol( exposure => 'parcel' );
 ok( !$public_exposure->equals($parcel_exposure),
@@ -57,10 +44,7 @@ my $ooga  = new_symbol( name => 'ooga' );
 my $booga = new_symbol( name => 'booga' );
 ok( !$ooga->equals($booga), "Different name spoils equals()" );
 
-my $eep = new_symbol(
-    class_name => "Op::Ork",
-    name       => 'ah_ah',
-);
+my $eep = new_symbol( name => 'ah_ah' );
 my $ork = Clownfish::CFC::Model::Class->create(
     parcel     => $parcel,
     class_name => 'Op::Ork',

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/89bf831d/compiler/perl/t/200-function.t
----------------------------------------------------------------------
diff --git a/compiler/perl/t/200-function.t b/compiler/perl/t/200-function.t
index 5a04a30..98455b8 100644
--- a/compiler/perl/t/200-function.t
+++ b/compiler/perl/t/200-function.t
@@ -28,7 +28,6 @@ $parser->parse('parcel Neato;')
 
 my %args = (
     return_type => $parser->parse('Obj*'),
-    class_name  => 'Neato::Foo',
     param_list  => $parser->parse('(int32_t some_num)'),
     name        => 'return_an_obj',
 );

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/89bf831d/compiler/perl/t/201-method.t
----------------------------------------------------------------------
diff --git a/compiler/perl/t/201-method.t b/compiler/perl/t/201-method.t
index 66fbc3e..f3467a7 100644
--- a/compiler/perl/t/201-method.t
+++ b/compiler/perl/t/201-method.t
@@ -16,7 +16,7 @@
 use strict;
 use warnings;
 
-use Test::More tests => 30;
+use Test::More tests => 38;
 
 BEGIN { use_ok('Clownfish::CFC::Model::Method') }
 use Clownfish::CFC::Parser;
@@ -48,6 +48,24 @@ eval {
 };
 like( $@, qr/name/, "Invalid name kills constructor" );
 
+for (qw( foo 1Foo Foo_Bar 1FOOBAR )) {
+    eval {
+        Clownfish::CFC::Model::Method->new(
+            %args,
+            class_name => $_,
+        );
+    };
+    like( $@, qr/class_name/, "Reject invalid class name $_" );
+    my $bogus_middle = "Foo::" . $_ . "::Bar";
+    eval {
+        Clownfish::CFC::Model::Method->new(
+            %args,
+            class_name => $bogus_middle,
+        );
+    };
+    like( $@, qr/class_name/, "Reject invalid class name $bogus_middle" );
+}
+
 my $dupe = Clownfish::CFC::Model::Method->new(%args);
 ok( $method->compatible($dupe), "compatible()" );
 

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/89bf831d/compiler/perl/t/300-variable.t
----------------------------------------------------------------------
diff --git a/compiler/perl/t/300-variable.t b/compiler/perl/t/300-variable.t
index 86029b2..278930f 100644
--- a/compiler/perl/t/300-variable.t
+++ b/compiler/perl/t/300-variable.t
@@ -68,9 +68,8 @@ my $lobclaw_class = $parser->parse(
     "class Crustacean::Lobster::LobsterClaw nickname LobClaw {}",
 );
 $var = Clownfish::CFC::Model::Variable->new(
-    name       => 'foo',
-    type       => new_type("Foo*"),
-    class_name => 'Crustacean::Lobster::LobsterClaw',
+    name => 'foo',
+    type => new_type("Foo*"),
 );
 $var->resolve_type;
 is( $var->global_c($lobclaw_class), 'neato_Foo* neato_LobClaw_foo',

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/89bf831d/compiler/perl/t/401-class.t
----------------------------------------------------------------------
diff --git a/compiler/perl/t/401-class.t b/compiler/perl/t/401-class.t
index 5380f1a..f456471 100644
--- a/compiler/perl/t/401-class.t
+++ b/compiler/perl/t/401-class.t
@@ -24,17 +24,14 @@ my $parser = Clownfish::CFC::Parser->new;
 $parser->parse('parcel Neato;');
 
 my $thing = Clownfish::CFC::Model::Variable->new(
-    class_name => 'Foo',
-    type       => $parser->parse('Thing*'),
-    name       => 'thing',
+    type => $parser->parse('Thing*'),
+    name => 'thing',
 );
 my $widget = Clownfish::CFC::Model::Variable->new(
-    class_name => 'Widget',
-    type       => $parser->parse('Widget*'),
-    name       => 'widget',
+    type => $parser->parse('Widget*'),
+    name => 'widget',
 );
 my $tread_water = Clownfish::CFC::Model::Function->new(
-    class_name  => 'Foo',
     return_type => $parser->parse('void'),
     name        => 'tread_water',
     param_list  => $parser->parse('()'),

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/89bf831d/compiler/src/CFCCallable.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCCallable.c b/compiler/src/CFCCallable.c
index a4f0e8d..26f9c42 100644
--- a/compiler/src/CFCCallable.c
+++ b/compiler/src/CFCCallable.c
@@ -38,16 +38,14 @@ static const CFCMeta CFCCALLABLE_META = {
 };
 
 CFCCallable*
-CFCCallable_init(CFCCallable *self, const char *exposure,
-                 const char *class_name, const char *name,
+CFCCallable_init(CFCCallable *self, const char *exposure, const char *name,
                  CFCType *return_type, CFCParamList *param_list,
                  CFCDocuComment *docucomment) {
 
     exposure = exposure ? exposure : "parcel";
-    CFCUTIL_NULL_CHECK(class_name);
     CFCUTIL_NULL_CHECK(return_type);
     CFCUTIL_NULL_CHECK(param_list);
-    CFCSymbol_init((CFCSymbol*)self, exposure, class_name, name);
+    CFCSymbol_init((CFCSymbol*)self, exposure, name);
     self->return_type = (CFCType*)CFCBase_incref((CFCBase*)return_type);
     self->param_list  = (CFCParamList*)CFCBase_incref((CFCBase*)param_list);
     self->docucomment = (CFCDocuComment*)CFCBase_incref((CFCBase*)docucomment);

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/89bf831d/compiler/src/CFCCallable.h
----------------------------------------------------------------------
diff --git a/compiler/src/CFCCallable.h b/compiler/src/CFCCallable.h
index 9bab598..7ac737f 100644
--- a/compiler/src/CFCCallable.h
+++ b/compiler/src/CFCCallable.h
@@ -44,8 +44,6 @@ struct CFCCallable {
 /**
  * @param exposure The callable's exposure (see
  * L<Clownfish::CFC::Model::Symbol>).
- * @param class_name The full name of the class in whose namespace the
- * function resides.
  * @param name The name of the callable, without any namespacing prefixes.
  * @param return_type A Clownfish::CFC::Model::Type representing the
  * callable's return type.
@@ -55,8 +53,7 @@ struct CFCCallable {
  * callable.
  */
 CFCCallable*
-CFCCallable_init(CFCCallable *self, const char *exposure,
-                 const char *class_name, const char *name,
+CFCCallable_init(CFCCallable *self, const char *exposure, const char *name,
                  struct CFCType *return_type, struct CFCParamList *param_list,
                  struct CFCDocuComment *docucomment);
 

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/89bf831d/compiler/src/CFCFunction.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCFunction.c b/compiler/src/CFCFunction.c
index d712403..bbfc88c 100644
--- a/compiler/src/CFCFunction.c
+++ b/compiler/src/CFCFunction.c
@@ -44,12 +44,12 @@ static const CFCMeta CFCFUNCTION_META = {
 };
 
 CFCFunction*
-CFCFunction_new(const char *exposure, const char *class_name, const char *name,
-                CFCType *return_type, CFCParamList *param_list,
-                CFCDocuComment *docucomment, int is_inline) {
+CFCFunction_new(const char *exposure, const char *name, CFCType *return_type,
+                CFCParamList *param_list, CFCDocuComment *docucomment,
+                int is_inline) {
     CFCFunction *self = (CFCFunction*)CFCBase_allocate(&CFCFUNCTION_META);
-    return CFCFunction_init(self, exposure, class_name, name, return_type,
-                            param_list, docucomment, is_inline);
+    return CFCFunction_init(self, exposure, name, return_type, param_list,
+                            docucomment, is_inline);
 }
 
 static int
@@ -64,8 +64,7 @@ S_validate_function_name(const char *name) {
 }
 
 CFCFunction*
-CFCFunction_init(CFCFunction *self, const char *exposure,
-                 const char *class_name, const char *name,
+CFCFunction_init(CFCFunction *self, const char *exposure, const char *name,
                  CFCType *return_type, CFCParamList *param_list,
                  CFCDocuComment *docucomment, int is_inline) {
 
@@ -73,8 +72,8 @@ CFCFunction_init(CFCFunction *self, const char *exposure,
         CFCBase_decref((CFCBase*)self);
         CFCUtil_die("Invalid function name: '%s'", name);
     }
-    CFCCallable_init((CFCCallable*)self, exposure, class_name, name,
-                     return_type, param_list, docucomment);
+    CFCCallable_init((CFCCallable*)self, exposure, name, return_type,
+                     param_list, docucomment);
     self->is_inline = is_inline;
     return self;
 }

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/89bf831d/compiler/src/CFCFunction.h
----------------------------------------------------------------------
diff --git a/compiler/src/CFCFunction.h b/compiler/src/CFCFunction.h
index 0793ab3..150b6b2 100644
--- a/compiler/src/CFCFunction.h
+++ b/compiler/src/CFCFunction.h
@@ -33,8 +33,6 @@ struct CFCClass;
 /**
  * @param exposure The function's exposure (see
  * L<Clownfish::CFC::Model::Symbol>).
- * @param class_name The full name of the class in whose namespace the
- * function resides.
  * @param name The name of the function, without any namespacing prefixes.
  * @param return_type A Clownfish::CFC::Model::Type representing the
  * function's return type.
@@ -46,13 +44,12 @@ struct CFCClass;
  * compiler.
  */
 CFCFunction*
-CFCFunction_new(const char *exposure, const char *class_name, const char *name,
+CFCFunction_new(const char *exposure, const char *name,
                 struct CFCType *return_type, struct CFCParamList *param_list,
                 struct CFCDocuComment *docucomment, int is_inline);
 
 CFCFunction*
-CFCFunction_init(CFCFunction *self, const char *exposure,
-                 const char *class_name, const char *name,
+CFCFunction_init(CFCFunction *self, const char *exposure, const char *name,
                  struct CFCType *return_type, struct CFCParamList *param_list,
                  struct CFCDocuComment *docucomment, int is_inline);
 

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/89bf831d/compiler/src/CFCMethod.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCMethod.c b/compiler/src/CFCMethod.c
index be17981..406a4f5 100644
--- a/compiler/src/CFCMethod.c
+++ b/compiler/src/CFCMethod.c
@@ -36,6 +36,7 @@
 struct CFCMethod {
     CFCCallable callable;
     CFCMethod *novel_method;
+    char *fresh_class_name;
     char *host_alias;
     int is_final;
     int is_abstract;
@@ -50,12 +51,12 @@ static const CFCMeta CFCMETHOD_META = {
 };
 
 CFCMethod*
-CFCMethod_new(const char *exposure, const char *class_name, const char *name,
-              CFCType *return_type, CFCParamList *param_list,
-              CFCDocuComment *docucomment, int is_final, int is_abstract) {
+CFCMethod_new(const char *exposure, const char *name, CFCType *return_type,
+              CFCParamList *param_list, CFCDocuComment *docucomment,
+              const char *class_name, int is_final, int is_abstract) {
     CFCMethod *self = (CFCMethod*)CFCBase_allocate(&CFCMETHOD_META);
-    return CFCMethod_init(self, exposure, class_name, name, return_type,
-                          param_list, docucomment, is_final, is_abstract);
+    return CFCMethod_init(self, exposure, name, return_type, param_list,
+                          docucomment, class_name, is_final, is_abstract);
 }
 
 static int
@@ -81,10 +82,16 @@ S_validate_meth_name(const char *meth_name) {
 }
 
 CFCMethod*
-CFCMethod_init(CFCMethod *self, const char *exposure, const char *class_name,
-               const char *name, CFCType *return_type,
-               CFCParamList *param_list, CFCDocuComment *docucomment,
+CFCMethod_init(CFCMethod *self, const char *exposure, const char *name,
+               CFCType *return_type, CFCParamList *param_list,
+               CFCDocuComment *docucomment, const char *class_name,
                int is_final, int is_abstract) {
+    // Validate class_name.
+    CFCUTIL_NULL_CHECK(class_name);
+    if (!CFCClass_validate_class_name(class_name)) {
+        CFCBase_decref((CFCBase*)self);
+        CFCUtil_die("Invalid class_name: '%s'", class_name);
+    }
     // Validate name.
     if (!S_validate_meth_name(name)) {
         CFCBase_decref((CFCBase*)self);
@@ -93,8 +100,8 @@ CFCMethod_init(CFCMethod *self, const char *exposure, const char *class_name,
     }
 
     // Super-init.
-    CFCCallable_init((CFCCallable*)self, exposure, class_name, name,
-                     return_type, param_list, docucomment);
+    CFCCallable_init((CFCCallable*)self, exposure, name, return_type,
+                     param_list, docucomment);
 
     // Verify that the first element in the arg list is a self.
     CFCVariable **args = CFCParamList_get_variables(param_list);
@@ -114,6 +121,7 @@ CFCMethod_init(CFCMethod *self, const char *exposure, const char *class_name,
     }
 
     self->novel_method      = NULL;
+    self->fresh_class_name  = CFCUtil_strdup(class_name);
     self->host_alias        = NULL;
     self->is_final          = is_final;
     self->is_abstract       = is_abstract;
@@ -134,6 +142,7 @@ CFCMethod_resolve_types(CFCMethod *self) {
 void
 CFCMethod_destroy(CFCMethod *self) {
     CFCBase_decref((CFCBase*)self->novel_method);
+    FREEMEM(self->fresh_class_name);
     FREEMEM(self->host_alias);
     CFCCallable_destroy((CFCCallable*)self);
 }
@@ -199,17 +208,13 @@ CFCMethod_override(CFCMethod *self, CFCMethod *orig) {
     // Check that the override attempt is legal.
     if (CFCMethod_final(orig)) {
         const char *orig_name  = CFCMethod_get_name(orig);
-        const char *orig_class = CFCMethod_get_class_name(orig);
-        const char *my_class   = CFCMethod_get_class_name(self);
         CFCUtil_die("Attempt to override final method '%s' from '%s' by '%s'",
-                    orig_name, orig_class, my_class);
+                    orig_name, orig->fresh_class_name, self->fresh_class_name);
     }
     if (!CFCMethod_compatible(self, orig)) {
         const char *orig_name  = CFCMethod_get_name(orig);
-        const char *orig_class = CFCMethod_get_class_name(orig);
-        const char *my_class   = CFCMethod_get_class_name(self);
         CFCUtil_die("Non-matching signatures for method '%s' in '%s' and '%s'",
-                    orig_name, orig_class, my_class);
+                    orig_name, orig->fresh_class_name, self->fresh_class_name);
     }
 
     // Mark the Method as no longer novel.
@@ -223,14 +228,13 @@ CFCMethod_override(CFCMethod *self, CFCMethod *orig) {
 CFCMethod*
 CFCMethod_finalize(CFCMethod *self) {
     const char *exposure   = CFCMethod_get_exposure(self);
-    const char *class_name = CFCMethod_get_class_name(self);
     const char *name       = CFCMethod_get_name(self);
     CFCMethod  *finalized
-        = CFCMethod_new(exposure, class_name, name,
+        = CFCMethod_new(exposure, name,
                         self->callable.return_type,
                         self->callable.param_list,
-                        self->callable.docucomment, true,
-                        self->is_abstract);
+                        self->callable.docucomment,
+                        self->fresh_class_name, true, self->is_abstract);
     finalized->novel_method
         = (CFCMethod*)CFCBase_incref((CFCBase*)self->novel_method);
     finalized->is_novel = self->is_novel;
@@ -256,14 +260,14 @@ CFCMethod_set_host_alias(CFCMethod *self, const char *alias) {
     if (!self->is_novel) {
         const char *name = CFCMethod_get_name(self);
         CFCUtil_die("Can't set_host_alias %s -- method %s not novel in %s",
-                    alias, name, CFCMethod_get_class_name(self));
+                    alias, name, self->fresh_class_name);
     }
     if (self->host_alias) {
         const char *name = CFCMethod_get_name(self);
         if (strcmp(self->host_alias, alias) == 0) { return; }
         CFCUtil_die("Can't set_host_alias %s -- already set to %s for method"
                     " %s in %s", alias, self->host_alias, name,
-                    CFCMethod_get_class_name(self));
+                    self->fresh_class_name);
     }
     self->host_alias = CFCUtil_strdup(alias);
 }
@@ -279,7 +283,7 @@ CFCMethod_exclude_from_host(CFCMethod *self) {
     if (!self->is_novel) {
         const char *name = CFCMethod_get_name(self);
         CFCUtil_die("Can't exclude_from_host -- method %s not novel in %s",
-                    name, CFCMethod_get_class_name(self));
+                    name, self->fresh_class_name);
     }
     self->is_excluded = true;
 }
@@ -379,15 +383,10 @@ CFCMethod_get_exposure(CFCMethod *self) {
     return CFCSymbol_get_exposure((CFCSymbol*)self);
 }
 
-const char*
-CFCMethod_get_class_name(CFCMethod *self) {
-    return CFCSymbol_get_class_name((CFCSymbol*)self);
-}
-
 int
 CFCMethod_is_fresh(CFCMethod *self, CFCClass *klass) {
     const char *class_name = CFCClass_get_name(klass);
-    return strcmp(CFCMethod_get_class_name(self), class_name) == 0;
+    return strcmp(self->fresh_class_name, class_name) == 0;
 }
 
 int

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/89bf831d/compiler/src/CFCMethod.h
----------------------------------------------------------------------
diff --git a/compiler/src/CFCMethod.h b/compiler/src/CFCMethod.h
index fa4df9e..643a10d 100644
--- a/compiler/src/CFCMethod.h
+++ b/compiler/src/CFCMethod.h
@@ -41,28 +41,28 @@ struct CFCDocuComment;
 /**
  * @param exposure See Clownfish::CFC::Model::Symbol.  Defaults to "parcel"
  * if not supplied.
- * @param class_name See Clownfish::CFC::Model::Function.
  * @param name - The mixed case name which will be used when invoking the
  * method.
  * @param return_type See Clownfish::CFC::Model::Function.
  * @param param_list - A Clownfish::CFC::Model::ParamList.  The first element
  * must be an object of the class identified by C<class_name>.
  * @param docucomment see Clownfish::CFC::Model::Function.  May be NULL.
+ * @param class_name The full name of the class in whose namespace the
+ * method is fresh.
  * @param is_final - Indicate whether the method is final.
  * @param is_abstract - Indicate whether the method is abstract.
  */
 CFCMethod*
-CFCMethod_new(const char *exposure, const char *class_name, const char *name,
+CFCMethod_new(const char *exposure, const char *name,
               struct CFCType *return_type, struct CFCParamList *param_list,
-              struct CFCDocuComment *docucomment, int is_final,
-              int is_abstract);
+              struct CFCDocuComment *docucomment, const char *class_name,
+              int is_final, int is_abstract);
 
 CFCMethod*
-CFCMethod_init(CFCMethod *self, const char *exposure, const char *class_name,
-               const char *name, struct CFCType *return_type,
-               struct CFCParamList *param_list,
-               struct CFCDocuComment *docucomment, int is_final,
-               int is_abstract);
+CFCMethod_init(CFCMethod *self, const char *exposure, const char *name,
+               struct CFCType *return_type, struct CFCParamList *param_list,
+               struct CFCDocuComment *docucomment, const char *class_name,
+               int is_final, int is_abstract);
 
 void
 CFCMethod_resolve_types(CFCMethod *self);
@@ -205,9 +205,6 @@ CFCMethod_excluded_from_host(CFCMethod *self);
 const char*
 CFCMethod_get_exposure(CFCMethod *self);
 
-const char*
-CFCMethod_get_class_name(CFCMethod *self);
-
 /** Return true if the method is fresh in `klass`.
  */
 int

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/89bf831d/compiler/src/CFCParseHeader.y
----------------------------------------------------------------------
diff --git a/compiler/src/CFCParseHeader.y b/compiler/src/CFCParseHeader.y
index 064199b..61d7ae1 100644
--- a/compiler/src/CFCParseHeader.y
+++ b/compiler/src/CFCParseHeader.y
@@ -70,12 +70,7 @@ S_new_var(CFCParser *state, char *exposure, char *modifiers, CFCType *type,
         inert = true;
     }
 
-    const char *class_name = NULL;
-    if (exposure && strcmp(exposure, "local") != 0) {
-        class_name     = CFCParser_get_class_name(state);
-    }
-    CFCVariable *var = CFCVariable_new(exposure, class_name, name, type,
-                                       inert);
+    CFCVariable *var = CFCVariable_new(exposure, name, type, inert);
 
     /* Consume tokens. */
     CFCBase_decref((CFCBase*)type);
@@ -87,8 +82,6 @@ static CFCBase*
 S_new_sub(CFCParser *state, CFCDocuComment *docucomment, 
           char *exposure, char *modifiers, CFCType *type, char *name,
           CFCParamList *param_list) {
-    const char *class_name = CFCParser_get_class_name(state);
-
     /* Find modifiers by scanning the list. */
     int is_abstract = false;
     int is_final    = false;
@@ -113,16 +106,16 @@ S_new_sub(CFCParser *state, CFCDocuComment *docucomment,
         if (is_final) {
             CFCUtil_die("Inert functions must not be final");
         }
-        sub = (CFCBase*)CFCFunction_new(exposure, class_name, name, type,
-                                        param_list, docucomment,
-                                        is_inline);
+        sub = (CFCBase*)CFCFunction_new(exposure, name, type, param_list,
+                                        docucomment, is_inline);
     }
     else {
         if (is_inline) {
             CFCUtil_die("Methods must not be inline");
         }
-        sub = (CFCBase*)CFCMethod_new(exposure, class_name, name, type,
-                                      param_list, docucomment, is_final,
+        const char *class_name = CFCParser_get_class_name(state);
+        sub = (CFCBase*)CFCMethod_new(exposure, name, type, param_list,
+                                      docucomment, class_name, is_final,
                                       is_abstract);
     }
 

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/89bf831d/compiler/src/CFCSymbol.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCSymbol.c b/compiler/src/CFCSymbol.c
index 6189c3b..2dd7ddc 100644
--- a/compiler/src/CFCSymbol.c
+++ b/compiler/src/CFCSymbol.c
@@ -35,9 +35,9 @@ static const CFCMeta CFCSYMBOL_META = {
 };
 
 CFCSymbol*
-CFCSymbol_new(const char *exposure, const char *class_name, const char *name) {
+CFCSymbol_new(const char *exposure, const char *name) {
     CFCSymbol *self = (CFCSymbol*)CFCBase_allocate(&CFCSYMBOL_META);
-    return CFCSymbol_init(self, exposure, class_name, name);
+    return CFCSymbol_init(self, exposure, name);
 }
 
 static int
@@ -64,17 +64,12 @@ S_validate_identifier(const char *identifier) {
 }
 
 CFCSymbol*
-CFCSymbol_init(CFCSymbol *self, const char *exposure, const char *class_name,
-               const char *name) {
+CFCSymbol_init(CFCSymbol *self, const char *exposure, const char *name) {
     // Validate.
     if (!S_validate_exposure(exposure)) {
         CFCBase_decref((CFCBase*)self);
         CFCUtil_die("Invalid exposure: '%s'", exposure ? exposure : "[NULL]");
     }
-    if (class_name && !CFCClass_validate_class_name(class_name)) {
-        CFCBase_decref((CFCBase*)self);
-        CFCUtil_die("Invalid class_name: '%s'", class_name);
-    }
     if (!name || !S_validate_identifier(name)) {
         CFCBase_decref((CFCBase*)self);
         CFCUtil_die("Invalid name: '%s'",  name ? name : "[NULL]");
@@ -82,7 +77,6 @@ CFCSymbol_init(CFCSymbol *self, const char *exposure, const char *class_name,
 
     // Assign.
     self->exposure       = CFCUtil_strdup(exposure);
-    self->class_name     = CFCUtil_strdup(class_name);
     self->name           = CFCUtil_strdup(name);
 
     return self;
@@ -91,7 +85,6 @@ CFCSymbol_init(CFCSymbol *self, const char *exposure, const char *class_name,
 void
 CFCSymbol_destroy(CFCSymbol *self) {
     FREEMEM(self->exposure);
-    FREEMEM(self->class_name);
     FREEMEM(self->name);
     CFCBase_destroy((CFCBase*)self);
 }
@@ -100,15 +93,6 @@ int
 CFCSymbol_equals(CFCSymbol *self, CFCSymbol *other) {
     if (strcmp(self->name, other->name) != 0) { return false; }
     if (strcmp(self->exposure, other->exposure) != 0) { return false; }
-    if (self->class_name) {
-        if (!other->class_name) { return false; }
-        if (strcmp(self->class_name, other->class_name) != 0) {
-            return false;
-        }
-    }
-    else if (other->class_name) {
-        return false;
-    }
     return true;
 }
 
@@ -148,11 +132,6 @@ CFCSymbol_short_sym(CFCSymbol *self, CFCClass *klass) {
 }
 
 const char*
-CFCSymbol_get_class_name(CFCSymbol *self) {
-    return self->class_name;
-}
-
-const char*
 CFCSymbol_get_exposure(CFCSymbol *self) {
     return self->exposure;
 }

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/89bf831d/compiler/src/CFCSymbol.h
----------------------------------------------------------------------
diff --git a/compiler/src/CFCSymbol.h b/compiler/src/CFCSymbol.h
index 397e016..d5226a3 100644
--- a/compiler/src/CFCSymbol.h
+++ b/compiler/src/CFCSymbol.h
@@ -38,7 +38,6 @@ struct CFCParcel;
 struct CFCSymbol {
     CFCBase base;
     char *exposure;
-    char *class_name;
     char *name;
 };
 #endif
@@ -46,18 +45,13 @@ struct CFCSymbol {
 /**
  * @param exposure The scope in which the symbol is exposed.  Must be
  * 'public', 'parcel', 'private', or 'local'.
- * @param class_name A optional class name, consisting of one or more
- * components separated by "::".  Each component must start with a capital
- * letter, contain at least one lower-case letter, and consist entirely of the
- * characters [A-Za-z0-9].
  * @param name The local identifier for the symbol.
  */
 CFCSymbol*
-CFCSymbol_new(const char *exposure, const char *class_name, const char *name);
+CFCSymbol_new(const char *exposure, const char *name);
 
 CFCSymbol*
-CFCSymbol_init(CFCSymbol *self, const char *exposure, const char *class_name,
-               const char *name);
+CFCSymbol_init(CFCSymbol *self, const char *exposure, const char *name);
 
 void
 CFCSymbol_destroy(CFCSymbol *self);
@@ -67,10 +61,6 @@ CFCSymbol_destroy(CFCSymbol *self);
 int
 CFCSymbol_equals(CFCSymbol *self, CFCSymbol *other);
 
-// May be NULL.
-const char*
-CFCSymbol_get_class_name(CFCSymbol *self);
-
 const char*
 CFCSymbol_get_exposure(CFCSymbol *self);
 

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/89bf831d/compiler/src/CFCTestClass.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCTestClass.c b/compiler/src/CFCTestClass.c
index 9c41d66..a91e3b9 100644
--- a/compiler/src/CFCTestClass.c
+++ b/compiler/src/CFCTestClass.c
@@ -65,17 +65,16 @@ S_run_tests(CFCTest *test) {
 
     {
         CFCType *thing_type = CFCTest_parse_type(test, parser, "Thing*");
-        thing = CFCVariable_new(NULL, "Foo", "thing", thing_type, 0);
+        thing = CFCVariable_new(NULL, "thing", thing_type, 0);
 
         CFCType *widget_type = CFCTest_parse_type(test, parser, "Widget*");
-        widget = CFCVariable_new(NULL, "Widget", "widget", widget_type, 0);
+        widget = CFCVariable_new(NULL, "widget", widget_type, 0);
 
         CFCType *return_type = CFCTest_parse_type(test, parser, "void");
         CFCParamList *param_list
             = CFCTest_parse_param_list(test, parser, "()");
-        tread_water
-            = CFCFunction_new(NULL, "Foo", "tread_water", return_type,
-                              param_list, NULL, 0);
+        tread_water = CFCFunction_new(NULL, "tread_water", return_type,
+                                      param_list, NULL, 0);
 
         CFCBase_decref((CFCBase*)thing_type);
         CFCBase_decref((CFCBase*)widget_type);

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/89bf831d/compiler/src/CFCTestFunction.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCTestFunction.c b/compiler/src/CFCTestFunction.c
index 1d54537..22dd487 100644
--- a/compiler/src/CFCTestFunction.c
+++ b/compiler/src/CFCTestFunction.c
@@ -42,9 +42,8 @@ S_run_tests(CFCTest *test) {
         CFCType *return_type = CFCTest_parse_type(test, parser, "Obj*");
         CFCParamList *param_list
             = CFCTest_parse_param_list(test, parser, "(int32_t some_num)");
-        CFCFunction *func
-            = CFCFunction_new(NULL, "Neato::Foo", "return_an_obj", return_type,
-                              param_list, NULL, 0);
+        CFCFunction *func = CFCFunction_new(NULL, "return_an_obj", return_type,
+                                            param_list, NULL, 0);
         OK(test, func != NULL, "new");
 
         CFCBase_decref((CFCBase*)return_type);

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/89bf831d/compiler/src/CFCTestMethod.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCTestMethod.c b/compiler/src/CFCTestMethod.c
index 6e20069..3fc5d57 100644
--- a/compiler/src/CFCTestMethod.c
+++ b/compiler/src/CFCTestMethod.c
@@ -65,24 +65,24 @@ S_run_basic_tests(CFCTest *test) {
         = CFCTest_parse_param_list(test, parser,
                                    "(Foo *self, int32_t count = 0)");
     CFCMethod *method
-        = CFCMethod_new(NULL, "Neato::Foo", "Return_An_Obj", return_type,
-                        param_list, NULL, 0, 0);
+        = CFCMethod_new(NULL, "Return_An_Obj", return_type, param_list, NULL,
+                        "Neato::Foo", 0, 0);
     OK(test, method != NULL, "new");
     OK(test, CFCSymbol_parcel((CFCSymbol*)method),
        "parcel exposure by default");
 
     {
         CFCMethod *dupe
-            = CFCMethod_new(NULL, "Neato::Foo", "Return_An_Obj", return_type,
-                            param_list, NULL, 0, 0);
+            = CFCMethod_new(NULL, "Return_An_Obj", return_type, param_list,
+                            NULL, "Neato::Foo", 0, 0);
         OK(test, CFCMethod_compatible(method, dupe), "compatible");
         CFCBase_decref((CFCBase*)dupe);
     }
 
     {
         CFCMethod *name_differs
-            = CFCMethod_new(NULL, "Neato::Foo", "Eat", return_type, param_list,
-                            NULL, 0, 0);
+            = CFCMethod_new(NULL, "Eat", return_type, param_list, NULL,
+                            "Neato::Foo", 0, 0);
         OK(test, !CFCMethod_compatible(method, name_differs),
            "different name spoils compatible");
         OK(test, !CFCMethod_compatible(name_differs, method),
@@ -109,8 +109,8 @@ S_run_basic_tests(CFCTest *test) {
             CFCParamList *other_param_list
                 = CFCTest_parse_param_list(test, parser, param_strings[i]);
             CFCMethod *other
-                = CFCMethod_new(NULL, "Neato::Foo", "Return_An_Obj",
-                                return_type, other_param_list, NULL, 0, 0);
+                = CFCMethod_new(NULL, "Return_An_Obj", return_type,
+                                other_param_list, NULL, "Neato::Foo", 0, 0);
             OK(test, !CFCMethod_compatible(method, other),
                "%s spoils compatible", test_names[i]);
             OK(test, !CFCMethod_compatible(other, method),
@@ -125,8 +125,8 @@ S_run_basic_tests(CFCTest *test) {
             = CFCTest_parse_param_list(test, parser,
                                        "(Bar *self, int32_t count = 0)");
         CFCMethod *self_differs
-            = CFCMethod_new(NULL, "Neato::Bar", "Return_An_Obj", return_type,
-                            self_differs_list, NULL, 0, 0);
+            = CFCMethod_new(NULL, "Return_An_Obj", return_type,
+                            self_differs_list, NULL, "Neato::Bar", 0, 0);
         OK(test, CFCMethod_compatible(method, self_differs),
            "different self type still compatible(),"
            " since can't test inheritance");
@@ -138,8 +138,8 @@ S_run_basic_tests(CFCTest *test) {
 
     {
         CFCMethod *aliased
-            = CFCMethod_new(NULL, "Neato::Foo", "Aliased", return_type,
-                            param_list, NULL, 0, 0);
+            = CFCMethod_new(NULL, "Aliased", return_type, param_list, NULL,
+                            "Neato::Foo", 0, 0);
         OK(test, !CFCMethod_get_host_alias(aliased),
            "no host alias by default");
         CFCMethod_set_host_alias(aliased, "Host_Alias");
@@ -150,8 +150,8 @@ S_run_basic_tests(CFCTest *test) {
 
     {
         CFCMethod *excluded
-            = CFCMethod_new(NULL, "Neato::Foo", "Excluded", return_type,
-                            param_list, NULL, 0, 0);
+            = CFCMethod_new(NULL, "Excluded", return_type, param_list, NULL,
+                            "Neato::Foo", 0, 0);
         OK(test, !CFCMethod_excluded_from_host(excluded),
            "not excluded by default");
         CFCMethod_exclude_from_host(excluded);
@@ -213,14 +213,14 @@ S_run_overridden_tests(CFCTest *test) {
     CFCParamList *param_list
         = CFCTest_parse_param_list(test, parser, "(Foo *self)");
     CFCMethod *orig
-        = CFCMethod_new(NULL, "Neato::Foo", "Return_An_Obj", return_type,
-                        param_list, NULL, 0, 0);
+        = CFCMethod_new(NULL, "Return_An_Obj", return_type, param_list, NULL,
+                        "Neato::Foo", 0, 0);
 
     CFCParamList *overrider_param_list
         = CFCTest_parse_param_list(test, parser, "(FooJr *self)");
     CFCMethod *overrider
-        = CFCMethod_new(NULL, "Neato::Foo::FooJr", "Return_An_Obj",
-                        return_type, overrider_param_list, NULL, 0, 0);
+        = CFCMethod_new(NULL, "Return_An_Obj", return_type,
+                        overrider_param_list, NULL, "Neato::Foo::FooJr", 0, 0);
 
     CFCMethod_override(overrider, orig);
     OK(test, !CFCMethod_novel(overrider),
@@ -251,8 +251,8 @@ S_run_final_tests(CFCTest *test) {
         = CFCTest_parse_param_list(test, parser, "(Foo *self)");
 
     CFCMethod *not_final
-        = CFCMethod_new(NULL, "Neato::Foo", "Return_An_Obj", return_type,
-                        param_list, NULL, 0, 0);
+        = CFCMethod_new(NULL, "Return_An_Obj", return_type, param_list, NULL,
+                        "Neato::Foo", 0, 0);
     CFCMethod_resolve_types(not_final);
     CFCMethod *final = CFCMethod_finalize(not_final);
     OK(test, CFCMethod_compatible(not_final, final),

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/89bf831d/compiler/src/CFCTestSymbol.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCTestSymbol.c b/compiler/src/CFCTestSymbol.c
index 12cf7f5..690e55c 100644
--- a/compiler/src/CFCTestSymbol.c
+++ b/compiler/src/CFCTestSymbol.c
@@ -32,7 +32,7 @@ S_run_tests(CFCTest *test);
 
 const CFCTestBatch CFCTEST_BATCH_SYMBOL = {
     "Clownfish::CFC::Model::Symbol",
-    22,
+    20,
     S_run_tests
 };
 
@@ -51,7 +51,7 @@ S_run_tests(CFCTest *test) {
             CFCSymbol_local
         };
         for (int i = 0; i < 4; ++i) {
-            CFCSymbol *symbol = CFCSymbol_new(exposures[i], NULL, "sym");
+            CFCSymbol *symbol = CFCSymbol_new(exposures[i], "sym");
             for (int j = 0; j < 4; ++j) {
                 int has_exposure = accessors[j](symbol);
                 if (i == j) {
@@ -67,21 +67,8 @@ S_run_tests(CFCTest *test) {
     }
 
     {
-        CFCSymbol *foo    = CFCSymbol_new("parcel", "Foo", "sym");
-        CFCSymbol *foo_jr = CFCSymbol_new("parcel", "Foo::FooJr", "sym");
-
-        int equal = CFCSymbol_equals(foo, foo_jr);
-        OK(test, !equal, "different class_name spoils equals");
-        const char *foo_jr_name = CFCSymbol_get_class_name(foo_jr);
-        STR_EQ(test, foo_jr_name, "Foo::FooJr", "get_class_name");
-
-        CFCBase_decref((CFCBase*)foo);
-        CFCBase_decref((CFCBase*)foo_jr);
-    }
-
-    {
-        CFCSymbol *public_exposure = CFCSymbol_new("public", NULL, "sym");
-        CFCSymbol *parcel_exposure = CFCSymbol_new("parcel", NULL, "sym");
+        CFCSymbol *public_exposure = CFCSymbol_new("public", "sym");
+        CFCSymbol *parcel_exposure = CFCSymbol_new("parcel", "sym");
         int equal = CFCSymbol_equals(public_exposure, parcel_exposure);
         OK(test, !equal, "different exposure spoils equals");
         CFCBase_decref((CFCBase*)public_exposure);
@@ -89,8 +76,8 @@ S_run_tests(CFCTest *test) {
     }
 
     {
-        CFCSymbol *ooga  = CFCSymbol_new("parcel", NULL, "ooga");
-        CFCSymbol *booga = CFCSymbol_new("parcel", NULL, "booga");
+        CFCSymbol *ooga  = CFCSymbol_new("parcel", "ooga");
+        CFCSymbol *booga = CFCSymbol_new("parcel", "booga");
         int equal = CFCSymbol_equals(ooga, booga);
         OK(test, !equal, "different name spoils equals");
         CFCBase_decref((CFCBase*)ooga);
@@ -103,7 +90,7 @@ S_run_tests(CFCTest *test) {
         CFCClass *ork
             = CFCClass_create(eep_parcel, NULL, "Op::Ork", NULL, NULL, NULL,
                               NULL, false, false, false);
-        CFCSymbol *eep = CFCSymbol_new("parcel", "Op::Ork", "ah_ah");
+        CFCSymbol *eep = CFCSymbol_new("parcel", "ah_ah");
         char *short_sym = CFCSymbol_short_sym(eep, ork);
         STR_EQ(test, short_sym, "Ork_ah_ah", "short_sym");
         FREEMEM(short_sym);

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/89bf831d/compiler/src/CFCTestVariable.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCTestVariable.c b/compiler/src/CFCTestVariable.c
index a8eec5a..d256c01 100644
--- a/compiler/src/CFCTestVariable.c
+++ b/compiler/src/CFCTestVariable.c
@@ -48,7 +48,7 @@ S_run_tests(CFCTest *test) {
 
     {
         CFCType *type = CFCTest_parse_type(test, parser, "float*");
-        CFCVariable *var = CFCVariable_new(NULL, NULL, "foo", type, 0);
+        CFCVariable *var = CFCVariable_new(NULL, "foo", type, 0);
         CFCVariable_resolve_type(var);
         STR_EQ(test, CFCVariable_local_c(var), "float* foo", "local_c");
         STR_EQ(test, CFCVariable_local_declaration(var), "float* foo;",
@@ -61,7 +61,7 @@ S_run_tests(CFCTest *test) {
 
     {
         CFCType *type = CFCTest_parse_type(test, parser, "float[1]");
-        CFCVariable *var = CFCVariable_new(NULL, NULL, "foo", type, 0);
+        CFCVariable *var = CFCVariable_new(NULL, "foo", type, 0);
         CFCVariable_resolve_type(var);
         STR_EQ(test, CFCVariable_local_c(var), "float foo[1]",
                "to_c appends array to var name rather than type specifier");
@@ -72,9 +72,7 @@ S_run_tests(CFCTest *test) {
 
     {
         CFCType *type = CFCTest_parse_type(test, parser, "Foo*");
-        CFCVariable *var
-            = CFCVariable_new(NULL, "Crustacean::Lobster::LobsterClaw", "foo",
-                              type, 0);
+        CFCVariable *var = CFCVariable_new(NULL, "foo", type, 0);
         CFCVariable_resolve_type(var);
         CFCClass *ork
             = CFCClass_create(neato_parcel, NULL,

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/89bf831d/compiler/src/CFCVariable.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCVariable.c b/compiler/src/CFCVariable.c
index 5b6804e..c2802fc 100644
--- a/compiler/src/CFCVariable.c
+++ b/compiler/src/CFCVariable.c
@@ -49,15 +49,14 @@ static void
 S_generate_c_strings(CFCVariable *self);
 
 CFCVariable*
-CFCVariable_new(const char *exposure, const char *class_name, const char *name,
-                struct CFCType *type, int inert) {
+CFCVariable_new(const char *exposure, const char *name, struct CFCType *type,
+                int inert) {
     CFCVariable *self = (CFCVariable*)CFCBase_allocate(&CFCVARIABLE_META);
-    return CFCVariable_init(self, exposure, class_name, name, type, inert);
+    return CFCVariable_init(self, exposure, name, type, inert);
 }
 
 CFCVariable*
-CFCVariable_init(CFCVariable *self, const char *exposure,
-                 const char *class_name, const char *name,
+CFCVariable_init(CFCVariable *self, const char *exposure, const char *name,
                  struct CFCType *type, int inert) {
     // Validate params.
     CFCUTIL_NULL_CHECK(type);
@@ -65,7 +64,7 @@ CFCVariable_init(CFCVariable *self, const char *exposure,
     // Default exposure to "local".
     const char *real_exposure = exposure ? exposure : "local";
 
-    CFCSymbol_init((CFCSymbol*)self, real_exposure, class_name, name);
+    CFCSymbol_init((CFCSymbol*)self, real_exposure, name);
 
     // Assign type, inert.
     self->type = (CFCType*)CFCBase_incref((CFCBase*)type);

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/89bf831d/compiler/src/CFCVariable.h
----------------------------------------------------------------------
diff --git a/compiler/src/CFCVariable.h b/compiler/src/CFCVariable.h
index a46eeaf..b42f16d 100644
--- a/compiler/src/CFCVariable.h
+++ b/compiler/src/CFCVariable.h
@@ -40,17 +40,15 @@ struct CFCType;
 
 /**
  * @param exposure See Clownfish::CFC::Model::Symbol.
- * @param class_name See Clownfish::CFC::Model::Symbol.
  * @param name The variable's name, without any namespacing prefixes.
  * @param type A Clownfish::CFC::Model::Type.
  */
 CFCVariable*
-CFCVariable_new(const char *exposure, const char *class_name, const char *name,
-                struct CFCType *type, int inert);
+CFCVariable_new(const char *exposure, const char *name, struct CFCType *type,
+                int inert);
 
 CFCVariable*
-CFCVariable_init(CFCVariable *self, const char *exposure,
-                 const char *class_name, const char *name,
+CFCVariable_init(CFCVariable *self, const char *exposure, const char *name,
                  struct CFCType *type, int inert);
 
 void