StaticClassGroup.pm 1.2 KB

1234567891011121314151617181920212223242526272829303132333435
  1. package Logos::Generator::Base::StaticClassGroup;
  2. use strict;
  3. sub _methodForClassWithScope {
  4. my $self = shift;
  5. my $class = shift;
  6. my $scope = shift;
  7. my $return = "";
  8. my $methodname = Logos::sigil($scope eq "+" ? "static_metaclass_lookup" : "static_class_lookup").$class;
  9. my $lookupMethod = $scope eq "+" ? "objc_getMetaClass" : "objc_getClass";
  10. # This is a dirty assumption - we believe that we will always be using a compiler that defines __GNUC__ and respects GNU C attributes.
  11. return "static __inline__ __attribute__((always_inline)) __attribute__((unused)) Class ".$methodname."(void) { static Class _klass; if(!_klass) { _klass = ".$lookupMethod."(\"".$class."\"); } return _klass; }";
  12. }
  13. sub declarations {
  14. my $self = shift;
  15. my $group = shift;
  16. my $return = "";
  17. return "" if scalar(keys %{$group->usedMetaClasses}) + scalar(keys %{$group->usedClasses}) + scalar(keys %{$group->declaredOnlyClasses}) == 0;
  18. foreach(keys %{$group->usedMetaClasses}) {
  19. $return .= $self->_methodForClassWithScope($_, "+");
  20. }
  21. foreach(keys %{$group->usedClasses}) {
  22. $return .= $self->_methodForClassWithScope($_, "-");
  23. }
  24. return $return;
  25. }
  26. sub initializers {
  27. return "";
  28. }
  29. 1;