Module: Rubygame::NamedResource::NamedResourceClassMethods

Defined in:
lib/rubygame/named_resource.rb

Overview

Adds class methods when the NamedResource module is included

in a class. (Here, we are assuming that the NamedResource
module was included in a class called MyClass.)

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#autoload_dirsObject

An Array of paths to check for files. See #find_file.



87
88
89
# File 'lib/rubygame/named_resource.rb', line 87

def autoload_dirs
  @autoload_dirs
end

Instance Method Details

#[](name) ⇒ Object

call-seq:

  MyClass[ name ]  ->  instance or nil

Retrieves an instance of the class from a per-class resource
table (Hash).

If no object has been saved under the given name, invoke
#autoload to try to load a new instance, store it in the
Hash table under this name, and sets the instance's @name
to this name.


101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/rubygame/named_resource.rb', line 101

def []( name )
  result = @resources[name]

  if result.nil?
    result = autoload(name)
    if result
      self[name] = result
      result.name = name
    end
  end

  return result
end

#[]=(name, value) ⇒ Object

call-seq:

  MyClass[ name ] = instance

Stores an instance of the class in a per-class resource table
(Hash) for future access. If another object is already stored
with this name, the old record is lost.

May raise:  TypeError, if you try to store anything
           that is not kind of this class.


126
127
128
129
130
131
132
# File 'lib/rubygame/named_resource.rb', line 126

def []=( name, value )
  if( value.kind_of? self )
    @resources[name] = value
  else
    raise TypeError, "#{self}#[]= can only store instances of #{self}"
  end
end

#autoload(name) ⇒ Object

call-seq:

  MyClass.autoload( name )  ->  instance or nil

This method is invoked when a non-existing resource is
accessed with #[]. By default, this method simply returns
nil, effectively disabling autoloading.

You should override this method in your class to provide
class-specific loading behavior, or leave it as the default if
you don't need autoloading. Your method should return either
an instance of the class, or nil.

NOTE: The #find_file method is useful for getting the full
path to a file which matches the name. That's what it's there
for, so you should use it!


150
151
152
# File 'lib/rubygame/named_resource.rb', line 150

def autoload( name )
  nil
end

#basename(path) ⇒ Object

call-seq:

  MyClass.basename( path )  ->  filename

Returns the basename for the path (i.e. the
filename without the directory). Same as
File.basename


162
163
164
# File 'lib/rubygame/named_resource.rb', line 162

def basename( path )
  File.basename( path )
end

#exist?(path) ⇒ Boolean

call-seq:

  MyClass.exist?( path )  ->  true or false

True if the given path points to a file
that exists, otherwise false. Same as
File.exist?

Returns:

  • (Boolean)


174
175
176
# File 'lib/rubygame/named_resource.rb', line 174

def exist?( path )
  File.exist?(path)
end

#find_file(filename) ⇒ Object

call-seq:

  MyClass.find_file( filename )  ->  path or nil

Checks every directory in @autoload_dirs for
a file with the given name, and returns the
path (directory and name) for the first match.

If no directories have a file with that name,
return nil.


189
190
191
192
193
194
195
196
197
198
199
# File 'lib/rubygame/named_resource.rb', line 189

def find_file( filename )
  dir = @autoload_dirs.find { |dir|
    exist?( File.join(dir,filename) )
  }

  if dir
    return File.join(dir,filename)
  else
    return nil
  end
end