Merge branch 'MDL-30300' of git://github.com/timhunt/moodle
authorEloy Lafuente (stronk7) <stronk7@moodle.org>
Wed, 16 Nov 2011 23:00:12 +0000 (00:00 +0100)
committerEloy Lafuente (stronk7) <stronk7@moodle.org>
Wed, 16 Nov 2011 23:00:12 +0000 (00:00 +0100)
question/behaviour/adaptive/behaviour.php
question/behaviour/behaviourbase.php
question/behaviour/deferredfeedback/behaviour.php
question/behaviour/immediatefeedback/behaviour.php
question/behaviour/informationitem/behaviour.php
question/behaviour/interactive/behaviour.php
question/behaviour/interactivecountback/behaviour.php
question/behaviour/missing/behaviour.php
question/behaviour/upgrade.txt

index c663b52..9144296 100644 (file)
@@ -38,8 +38,8 @@ defined('MOODLE_INTERNAL') || die();
 class qbehaviour_adaptive extends question_behaviour_with_save {
     const IS_ARCHETYPAL = true;
 
-    public function required_question_definition_type() {
-        return 'question_automatically_gradable';
+    public function is_compatible_question(question_definition $question) {
+        return $question instanceof question_automatically_gradable;
     }
 
     public function get_expected_data() {
index 95c0e2a..ca09117 100644 (file)
@@ -70,21 +70,39 @@ abstract class question_behaviour {
     public function __construct(question_attempt $qa, $preferredbehaviour) {
         $this->qa = $qa;
         $this->question = $qa->get_question();
-        $requiredclass = $this->required_question_definition_type();
-        if (!$this->question instanceof $requiredclass) {
+        if (!$this->is_compatible_question($this->question)) {
             throw new coding_exception('This behaviour (' . $this->get_name() .
                     ') cannot work with this question (' . get_class($this->question) . ')');
         }
     }
 
+    /**
+     * Some behaviours can only work with certing types of question. This method
+     * allows the behaviour to verify that a question is compatible.
+     *
+     * This implementation is only provided for backwards-compatibility. You should
+     * override this method if you are implementing a behaviour.
+     *
+     * @param question_definition $question the question.
+     */
+    public function is_compatible_question(question_definition $question) {
+        $requiredclass = $this->required_question_definition_type();
+        return $this->question instanceof $requiredclass;
+    }
+
     /**
      * Most behaviours can only work with {@link question_definition}s
      * of a particular subtype, or that implement a particular interface.
      * This method lets the behaviour document that. The type of
      * question passed to the constructor is then checked against this type.
+     *
+     * @deprecated since 2.2. Please use/override {@link is_compatible_question()} instead.
+     *
      * @return string class/interface name.
      */
-    public abstract function required_question_definition_type();
+    protected function required_question_definition_type() {
+        return 'question_definition';
+    }
 
     /**
      * @return string the name of this behaviour. For example the name of
index 8bc59fc..5c5de7a 100644 (file)
@@ -40,8 +40,8 @@ defined('MOODLE_INTERNAL') || die();
 class qbehaviour_deferredfeedback extends question_behaviour_with_save {
     const IS_ARCHETYPAL = true;
 
-    public function required_question_definition_type() {
-        return 'question_automatically_gradable';
+    public function is_compatible_question(question_definition $question) {
+        return $question instanceof question_automatically_gradable;
     }
 
     public static function get_unused_display_options() {
index 2e7bbe0..f12db5d 100644 (file)
@@ -42,8 +42,8 @@ defined('MOODLE_INTERNAL') || die();
 class qbehaviour_immediatefeedback extends question_behaviour_with_save {
     const IS_ARCHETYPAL = true;
 
-    public function required_question_definition_type() {
-        return 'question_automatically_gradable';
+    public function is_compatible_question(question_definition $question) {
+        return $question instanceof question_automatically_gradable;
     }
 
     public function get_min_fraction() {
index 8c2cefe..472a6e2 100644 (file)
@@ -39,8 +39,8 @@ defined('MOODLE_INTERNAL') || die();
  */
 class qbehaviour_informationitem extends question_behaviour {
 
-    public function required_question_definition_type() {
-        return 'question_definition';
+    public function is_compatible_question(question_definition $question) {
+        return true;
     }
 
     public function get_expected_data() {
index 976bb08..27e0b30 100644 (file)
@@ -52,8 +52,8 @@ class qbehaviour_interactive extends question_behaviour_with_save {
      */
     const READONLY_EXCEPT_TRY_AGAIN = 23485299;
 
-    public function required_question_definition_type() {
-        return 'question_automatically_gradable';
+    public function is_compatible_question(question_definition $question) {
+        return $question instanceof question_automatically_gradable;
     }
 
     public function get_right_answer_summary() {
index 5b3e7f4..8a14cb7 100644 (file)
@@ -64,8 +64,8 @@ require_once(dirname(__FILE__) . '/../interactive/behaviour.php');
 class qbehaviour_interactivecountback extends qbehaviour_interactive {
     const IS_ARCHETYPAL = false;
 
-    public function required_question_definition_type() {
-        return 'question_automatically_gradable_with_countback';
+    public function is_compatible_question(question_definition $question) {
+        return $question instanceof question_automatically_gradable_with_countback;
     }
 
     protected function adjust_fraction($fraction, question_attempt_pending_step $pendingstep) {
index 1726e01..3475040 100644 (file)
@@ -45,8 +45,9 @@ defined('MOODLE_INTERNAL') || die();
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 class qbehaviour_missing extends question_behaviour {
-    public function required_question_definition_type() {
-        return 'question_definition';
+
+    public function is_compatible_question(question_definition $question) {
+        return true;
     }
 
     public function summarise_action(question_attempt_step $step) {
index db780e8..63b941e 100644 (file)
@@ -2,10 +2,15 @@ This files describes API changes for question behaviour plugins.
 
 === 2.2 ===
 
-* The old
+1) The old
     public static function get_required_behaviours()
 method is no more. Instead use the ->dependencies facility in version.php. E.g.
 $plugin->dependencies = array(
     'qbehaviour_immediatefeedback' => 2011102700,
     'qbehaviour_deferredcbm'       => 2011102700
 );
+
+2) The old required_question_definition_type method has been replaced by a new
+is_compatible_question method. You should change your behaviour to override the
+new method, not the old one. This change has been implemented in a
+backwards-compatible way, so behaviours will not break.