<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -49,7 +49,7 @@ Please not that Windows is not supported at this time.
   $ git clone git://github.com/aurelian/ruby-stemmer.git
   $ cd ruby-stemmer
   $ rake -T #&lt;== see what we've got
-  $ rake ext #&lt;== builds the extension do'h
+  $ rake compile #&lt;== builds the extension do'h
   $ rake test
 
 == NOT A BUG</diff>
      <filename>README.rdoc</filename>
    </modified>
    <modified>
      <diff>@@ -1,20 +1,10 @@
 #include &quot;ruby.h&quot;
 #include &lt;libstemmer.h&gt;
 
-#define GetStemmer(obj, sb_data) {\
-  Data_Get_Struct(obj, struct sb_stemmer_data, sb_data);\
-}
-
 VALUE rb_mLingua;
 VALUE rb_cStemmer;
 VALUE rb_eStemmerError;
 
-struct sb_stemmer_data {
-  struct sb_stemmer * stemmer;
-  const char * lang;
-  const char * enc;
-};
-
 /*
  * Document-method: new
  * call-seq: Lingua::Stemmer.new
@@ -26,48 +16,27 @@ struct sb_stemmer_data {
  *   s = Lingua::Stemmer.new :language =&gt; 'fr'
  */ 
 static VALUE 
-rb_stemmer_init(int argc, VALUE *argv, VALUE self) { 
-  VALUE roptions, rlang, renc;
-
+rb_stemmer_init(VALUE self, VALUE rlang, VALUE renc) { 
   struct sb_stemmer * stemmer;
-  struct sb_stemmer_data *sb_data;
 
-  rb_scan_args(argc, argv, &quot;01&quot;, &amp;roptions);
-  
-  if(argc &gt; 0) {
-    Check_Type(roptions, T_HASH);
-    if((rlang = rb_hash_aref(roptions, ID2SYM(rb_intern(&quot;language&quot;)))) != Qnil) {
-      Check_Type(rlang, T_STRING);
-    } else {
-      rlang = rb_str_new2(&quot;en&quot;);
-    }
-    if((renc = rb_hash_aref(roptions, ID2SYM(rb_intern(&quot;encoding&quot;)))) != Qnil) {
-      Check_Type(renc, T_STRING);
-    } else {
-      renc = rb_str_new2(&quot;UTF_8&quot;);
-    }
-  } else {
-    rlang = rb_str_new2(&quot;en&quot;);
-    renc  = rb_str_new2(&quot;UTF_8&quot;);
-  }
-  
+  Data_Get_Struct(self, struct sb_stemmer, stemmer);
+
+  // In case someone sends() this method, free up the old one
+  if(stemmer) sb_stemmer_delete(stemmer);
+
   stemmer = sb_stemmer_new( RSTRING_PTR(rlang), RSTRING_PTR(renc) );
-  if (stemmer == 0) {
-    if (renc == 0 ) {
-      rb_raise(rb_eStemmerError, &quot;Language %s not available for stemming&quot;, RSTRING_PTR(rlang));
-      exit(1);
+  if (!stemmer) {
+    if (!RTEST(renc)) {
+      rb_raise(rb_eStemmerError,
+          &quot;Language %s not available for stemming&quot;, RSTRING_PTR(rlang));
     } else {
-      rb_raise(rb_eStemmerError, &quot;Language %s not available for stemming in encoding %s&quot;, 
+      rb_raise(rb_eStemmerError,
+          &quot;Language %s not available for stemming in encoding %s&quot;, 
                     RSTRING_PTR(rlang), RSTRING_PTR(renc));
-      exit(1);
     }
   }
   
-  sb_data = ALLOC(struct sb_stemmer_data);
-  DATA_PTR(self) = sb_data;
-  sb_data-&gt;stemmer= stemmer;
-  sb_data-&gt;lang   = RSTRING_PTR(rlang);
-  sb_data-&gt;enc    = RSTRING_PTR(renc);
+  DATA_PTR(self) = stemmer;
 
   return self;
 }
@@ -84,52 +53,23 @@ rb_stemmer_init(int argc, VALUE *argv, VALUE self) {
  */ 
 static VALUE
 rb_stemmer_stem(VALUE self, VALUE word) {
-  struct sb_stemmer_data * sb_data;
-  const  sb_symbol * stemmed;
-  VALUE s_word = rb_String(word);
-  GetStemmer(self, sb_data);
-  stemmed = sb_stemmer_stem(sb_data-&gt;stemmer, (sb_symbol *)RSTRING_PTR(s_word), RSTRING_LEN(s_word));
-  return rb_str_new2((char *)stemmed);
-}
+  struct sb_stemmer * stemmer;
 
-/*
- * Document-method: language
- * call-seq: language
- *
- * Gets the language for this stemmer
- *
- *   require 'lingua/stemmer'
- *   s = Lingua::Stemmer.new(:language =&gt; &quot;fr&quot;)
- *   s.language #=&gt; &quot;fr&quot;
- */ 
-static VALUE
-rb_stemmer_language(VALUE self) {
-  struct sb_stemmer_data * sb_data;
-  GetStemmer(self, sb_data);
-  return rb_str_new2(sb_data-&gt;lang);
-}
+  Data_Get_Struct(self, struct sb_stemmer, stemmer);
+  if(!stemmer) rb_raise(rb_eRuntimeError, &quot;Stemmer not initialize&quot;);
 
-/*
- * Document-method: encoding
- * call-seq: encoding
- *
- * Gets the encoding for this stemmer
- *
- *   require 'lingua/stemmer'
- *   s = Lingua::Stemmer.new(:language =&gt; &quot;UTF_8&quot;)
- *   s.encoding #=&gt; &quot;UTF_8&quot;
- */ 
-static VALUE
-rb_stemmer_encoding(VALUE self) {
-  struct sb_stemmer_data * sb_data;
-  GetStemmer(self, sb_data);
-  return rb_str_new2(sb_data-&gt;enc);
+  VALUE s_word = rb_String(word);
+  const sb_symbol * stemmed = sb_stemmer_stem(stemmer,
+      (sb_symbol *)RSTRING_PTR(s_word),
+      RSTRING_LEN(s_word)
+  );
+  return rb_str_new2((char *)stemmed);
 }
 
 static void
-sb_stemmer_free(struct sb_stemmer_data * sb_data)
+sb_stemmer_free(struct sb_stemmer * stemmer)
 {
-  sb_stemmer_delete(sb_data-&gt;stemmer);
+  if(stemmer) sb_stemmer_delete(stemmer);
 }
 
 static VALUE
@@ -146,9 +86,7 @@ void Init_stemmer_native() {
   rb_cStemmer = rb_define_class_under(rb_mLingua, &quot;Stemmer&quot;, rb_cObject);
   rb_define_alloc_func(rb_cStemmer, sb_stemmer_alloc);
   rb_eStemmerError = rb_define_class_under(rb_mLingua, &quot;StemmerError&quot;, rb_eException);  
-  rb_define_method(rb_cStemmer, &quot;initialize&quot;, rb_stemmer_init, -1);
+  rb_define_private_method(rb_cStemmer, &quot;native_init&quot;, rb_stemmer_init, 2);
   rb_define_method(rb_cStemmer, &quot;stem&quot;, rb_stemmer_stem, 1);
-  rb_define_method(rb_cStemmer, &quot;language&quot;, rb_stemmer_language, 0);
-  rb_define_method(rb_cStemmer, &quot;encoding&quot;, rb_stemmer_encoding, 0);
 }
 </diff>
      <filename>ext/lingua/stemmer.c</filename>
    </modified>
    <modified>
      <diff>@@ -5,24 +5,42 @@ else
 end
 
 module Lingua
-
   def self.stemmer(o, options={})
-    _stemmer= Stemmer.new({:language =&gt; &quot;en&quot;, :encoding =&gt; &quot;UTF_8&quot;}.merge(options))
-    words= o.kind_of?(Array)? o.map{|e|e.to_s} : [o.to_s]
-    results = [] unless block_given?
-    words.each do | word |
-      result = _stemmer.stem(word)
+    stemmer = Stemmer.new(options)
+
+    words = Array(o).map { |e| e.to_s }
+
+    results = []
+    words.each do |word|
+      result = stemmer.stem(word)
       if block_given?
         yield result
       else
         results &lt;&lt; result
       end
     end
-    return (results.length == 1)? results[0] : results unless block_given?
-    _stemmer
+
+    return stemmer if block_given?
+    results.length == 1 ? results[0] : results
   end
 
   class Stemmer
     VERSION = File.read(File.expand_path(File.join(File.dirname(__FILE__), &quot;..&quot;, &quot;..&quot;, &quot;VERSION&quot;))).strip!
+
+    attr_reader :language
+    attr_reader :encoding
+
+    # Creates a new Stemmer, pass &lt;tt&gt;:language&lt;/tt&gt; and &lt;tt&gt;:encoding&lt;/tt&gt;
+    # as arguments to change encoding or language, otherwise english with UTF_8
+    # will be used
+    #
+    #   require 'lingua/stemmer'
+    #   s = Lingua::Stemmer.new :language =&gt; 'fr'
+    #
+    def initialize options = {}
+      @language = (options[:language] || 'en').to_s
+      @encoding = (options[:encoding] || 'UTF_8').to_s
+      native_init @language, @encoding
+    end
   end
 end</diff>
      <filename>lib/lingua/stemmer.rb</filename>
    </modified>
    <modified>
      <diff>@@ -38,4 +38,11 @@ class TestStemmer &lt; Test::Unit::TestCase
     assert_kind_of Array, results
   end
 
+  def test_stemmer_subclass
+    assert_raises(RuntimeError) do
+      Class.new(Lingua::Stemmer) {
+        def native_init a, b; end
+      }.new.stem('cow')
+    end
+  end
 end</diff>
      <filename>test/lingua/test_stemmer.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>38ccbd5339ffdb918631508029e1ee4f9a0fdec3</id>
    </parent>
  </parents>
  <author>
    <name>Aaron Patterson</name>
    <email>aaron.patterson@gmail.com</email>
  </author>
  <url>http://github.com/aurelian/ruby-stemmer/commit/d939c73bec7292d7b9d7e92f5100338fa1979fff</url>
  <id>d939c73bec7292d7b9d7e92f5100338fa1979fff</id>
  <committed-date>2009-11-02T11:49:45-08:00</committed-date>
  <authored-date>2009-11-02T11:49:45-08:00</authored-date>
  <message>cleaning up C and Ruby codes</message>
  <tree>8c7b4a38641ab353ed5e44563ddc79d79009cdff</tree>
  <committer>
    <name>Aaron Patterson</name>
    <email>aaron.patterson@gmail.com</email>
  </committer>
</commit>
